package cn.cqnu.controller.front;


import cn.cqnu.domin.vo.ResponseResult;
import cn.hutool.core.codec.Base64Encoder;
import com.google.code.kaptcha.Producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
public class CaptchaController {

    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private Producer producer;

    @GetMapping("/captcha")
    private ResponseResult getCaptcha() throws IOException {
        //    1. 生成验证码
        String code = producer.createText();

        //    2. 生成对应验证码图片
        //producer对象的createImage()方法生成包含验证码文本的验证码图片，并将其存储在image变量中
        BufferedImage image = producer.createImage(code);
        //创建一个ByteArrayOutputStream对象，用于将生成的验证码图片写入到字节数组中
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        //使用ImageIO.write()方法将image对象以JPEG格式写入到byteArrayOutputStream中
        ImageIO.write(image, "jpg", byteArrayOutputStream);
        //创建一个Base64Encoder对象，用于将字节数组转换为Base64编码
        Base64Encoder encoder = new Base64Encoder();
        //用于指定Base64编码的数据格式，这里是指定为JPEG格式
        String str = "data:image/jpeg;base64,";
        //将字节数组转换为Base64编码，并将其与str字符串拼接，得到最终的Base64编码的验证码图片字符串base64Image
        String base64Image = str + encoder.encode(byteArrayOutputStream.toByteArray());


        //    3. 生成UUID作为key一同返回
        String key = UUID.randomUUID().toString().replace("-", "");

        //    4. 存储到Redis中 注册时比对
        redisTemplate.opsForValue().set(key, code, 180, TimeUnit.SECONDS);


        HashMap<String, Object> result = new HashMap<>();
        result.put("key", key);
        result.put("captcha", base64Image);
        return ResponseResult.ok(result);
    }

}
